4. Implementing WebWork actions
4.1 The Action interface
- WebWork의 action이 되기 위해서는 오직 com.opensymphony.xwork.Action interface만 구현하면 됩
public String execute() throws Exception
4.1.1 Result codes
- execute() 메소드에서는 String 값을 리턴해야 한다.
- return 되는 String 값은 어떤 값이든 상관 없다.
- INPUT, SUCCESS, ERROR, NONE, LOGIN은 Action interface에 static final String으로 정의되어 있다.
public String saveCategory() {
if (category == null) {
return INPUT;
}
categoryDAO.makePersistent(category);
return SUCCESS;
}
- xwork.xml 파일에 Action의 리턴값에 대해 각각의 행동을 맵핑해야 한다.
<action name="saveCategory" class="org.hibernate.auction.web.actions.categories.EditCategory" method="saveCategory">
<interceptor-ref name="crudStack"/>
<result name="input">createCategory.jsp</result>
<result name="success" type="redirect">dashboard.action</result>
</action>
4.1.2 Handling exceptions
- Action interface의 execute() method에서는 java.lang.Exception를 throws 하도록 선언되어 있다.
4.2 Using the ActionSupport base class
- ActionSupport 클래스는 action 클래스를 쉽게 개발 할 수 있도록 다양한 기능들을 기본적으로 구현해주고 있다.
- action들은 ActionSupport를 상속할 필요도 없고 추가적인 인터페이스도 구현할 필요도 없이 com.opensymphony.xwork.Action만 구현하면 된다.
- ActionSupport 클래스가 기본적으로 구현해주는 인터페이스들
- com.opensymphony.xwork.Validateable : action에서 검증을 하기 위한 validate() 메소드 제공
- com.opensymphony.xwork.ValidationAware : action과 field-level의 에러를 저장하기 위한 메소드 제공
- com.opensymphony.xwork.TextProvider : localized message text를 얻기 위한 메소드 제공
- com.opensymphony.xwork.LocaleProvider : locale 정보를 얻기위한 getLocale() 메소드를 제공
4.4 Using localized message texts
4.4.1 Retrieving the user's locale: LocaleProvider
- com.opensymphony.xwork.LocaleProvider : Locale정보를 제공하는 인터페이스 (java.util.Locale)
- ActionSupport에 locale 정보를 제공하는 코드가 기본적으로 구현되어 있다.
ActionContext.getContext().getLocale()
4.4.2 Displaying the localized text: TextProvider
- com.opensymphony.xwork.TextProvider : 지역화 된 텍스트 메세지 기능을 제공하는 인터페이스 (java.util.ResourceBundle)
- text 정보를 담은 파일은 패키지 클래스가 있는 위치에 있어야하고, 파일명은 클래스명과 동일
- 클래스명 : org.hibernate.auction.web.actions.users.CreateUser 클래스에서 사용되는 프러퍼티 파일
- 경로: org/hibernate/auction/web/actions/users
- 파일명 : CreateUser_ko.properties
- 파일 내용 : user.exists=The user already exists
public void validate() {
// see if the name already exists
String username = this.user.getUsername();
User existing = userDAO.findByUsername(username);
if (existing != null) {
addFieldError("user.username", getText("user.exists"));
}
}
- Intermediary objects는 입력값과 domain object 사이에 다리 역할을 함.
- 임시적인 데이터 저장소로써 데이터검증 , 타입변환 , 필드조작등의 역할을 수행함
4.5.2 Using domain objects directly
- domain object 프로퍼티에 바로 접근하게 구성
<ww:form action="createUser">
<ww:textfield label="%{getText('username')}" name="user.username"/>
<ww:password label="%{getText('password')}" name="user.password"/>
<ww:textfield label="%{getText('firstname')}" name="user.firstname"/>
<ww:textfield label="%{getText('lastname')}" name="user.lastname"/>
<ww:textfield label="%{getText('email')}" name="user.email"/>
<ww:submit value="Submit"/>
</ww:form>
public class CreateUser extends ActionSupport implements UserDAOAware {
User user;
...
public String execute() throws Exception {
userDAO.makePersistent(user);
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
- 웹워크가 인스턴트를 생성한 후 자동으로 값을 설정 함
- 어느 레벨이든 상관 없음 (user.address.street → getUser().getAddress().setStreet(...))
Advantages of using domain objects
- value object를 만들 필요도 없고 domain object와 value object간의 mapping코드를 만들지 않아도 되어 시간 절약 됨
- 복잡한 도메인 오브젝트들도 편리하게 사용 할 수 있음(chapter 12 에서 설명 예정)
- Object Graph Navigation Language (OGNL) 을 지원 (chapter 8 에서 설명 예정)
문서에 대하여